package com.castle.fortress.admin.argFlow.service;

import com.castle.fortress.admin.argFlow.dto.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * RAGFlow服务接口
 */
public interface RAGFlowService {

    /**
     * 创建数据集
     *
     * @param request 创建数据集请求
     * @return 数据集响应
     */
    ResponseDTO<DatasetResponseDTO.DatasetData> createDataset(DatasetRequestDTO request);

    /**
     * 获取数据集
     *
     * @param datasetId 数据集ID
     * @return 数据集响应
     */
    ResponseDTO<DatasetResponseDTO.DatasetData> getDataset(String datasetId);

    /**
     * 获取数据集列表
     *
     * @param page 页码
     * @param pageSize 每页大小
     * @param orderBy 排序字段
     * @param desc 是否降序
     * @param name 数据集名称
     * @param id 数据集ID
     * @return 数据集列表响应
     */
    ResponseDTO<Map<String, Object>> listDatasets(Integer page, Integer pageSize, String orderBy, Boolean desc, String name, String id);

    /**
     * 更新数据集
     *
     * @param datasetId 数据集ID
     * @param request 更新数据集请求
     * @return 数据集响应
     */
    ResponseDTO<DatasetResponseDTO.DatasetData> updateDataset(String datasetId, DatasetRequestDTO request);

    /**
     * 删除数据集
     *
     * @param datasetId 数据集ID
     * @return 响应结果
     */
    ResponseDTO<Void> deleteDataset(String datasetId);

    /**
     * 上传文档
     *
     * @param datasetId 数据集ID
     * @param file 文件
     * @param type 文档类型
     * @param chunkMethod 分块方法
     * @param parserConfig 解析配置
     * @return 响应结果
     */
    ResponseDTO<Map<String, Object>> uploadDocument(String datasetId, MultipartFile file, String type, String chunkMethod, String parserConfig);

    /**
     * 更新文档
     *
     * @param datasetId 数据集ID
     * @param documentId 文档ID
     * @param request 更新文档请求
     * @return 响应结果
     */
    ResponseDTO<Map<String, Object>> updateDocument(String datasetId, String documentId, DocumentRequestDTO request);

    /**
     * 下载文档
     *
     * @param datasetId 数据集ID
     * @param documentId 文档ID
     * @param response HTTP响应
     */
    void downloadDocument(String datasetId, String documentId, HttpServletResponse response);

    /**
     * 获取文档列表
     *
     * @param datasetId 数据集ID
     * @param page 页码
     * @param pageSize 每页大小
     * @param orderBy 排序字段
     * @param desc 是否降序
     * @param keywords 关键词
     * @param id 文档ID
     * @param name 文档名称
     * @return 文档列表响应
     */
    ResponseDTO<DocumentResponseDTO.DocumentData> listDocuments(String datasetId, Integer page, Integer pageSize, String orderBy, Boolean desc, String keywords, String id, String name);

    /**
     * 删除文档
     *
     * 删除指定数据集中的文档。可以通过提供文档ID列表进行批量删除，
     * 如果未提供文档ID列表，则会删除该数据集中的所有文档。
     *
     * @param datasetId 数据集ID
     * @param ids 文档ID列表，如果为null或空列表，则删除数据集中的所有文档
     * @return 响应结果
     */
    ResponseDTO<Void> deleteDocuments(String datasetId, List<String> ids);

    /**
     * 解析文档
     *
     * 将上传的文档解析为块，以便于进行检索和处理。
     * 该接口会触发文档的解析过程，解析完成后，文档中的内容将被转换为多个文本块。
     * 这些文本块可以被用于检索和生成答案。
     *
     * 根据API文档，document_ids是必需的参数，表示要解析的文档ID列表。
     *
     * @param datasetId 数据集ID，标识要操作的数据集
     * @param documentIds 文档ID列表，不能为空，标识要解析的文档
     * @return 响应结果，成功时返回code=0
     */
    ResponseDTO<Void> parseDocuments(String datasetId, List<String> documentIds);

    /**
     * 停止解析文档
     *
     * 停止正在进行的文档解析过程。此接口可用于中断那些耗时较长或者不再需要继续解析的文档处理任务。
     * 接口会立即尝试停止指定文档的解析过程，但可能无法立即停止已经在进行中的某些操作。
     *
     * 根据API文档，document_ids参数是必需的，表示要停止解析的文档ID列表。如果提供的文档ID不存在或
     * 已经完成解析，接口通常会正常返回而不报错。
     *
     * 调用示例:
     * DELETE /api/v1/datasets/{dataset_id}/chunks
     * 请求体: {"document_ids": ["id1", "id2"]}
     *
     * @param datasetId 数据集ID，标识要操作的数据集
     * @param documentIds 文档ID列表，不能为空，标识要停止解析的文档
     * @return 响应结果，成功时返回code=0
     */
    ResponseDTO<Void> stopParsingDocuments(String datasetId, List<String> documentIds);

    /**
     * 添加块
     *
     * @param datasetId 数据集ID
     * @param request 添加块请求
     * @return 响应结果
     */
    ResponseDTO<Map<String, Object>> addChunk(String datasetId, ChunkRequestDTO request);

    /**
     * 获取块列表
     *
     * @param datasetId 数据集ID
     * @param page 页码
     * @param pageSize 每页大小
     * @param documentId 文档ID
     * @return 块列表响应
     */
    ResponseDTO<ChunkResponseDTO.ChunkData> listChunks(String datasetId, Integer page, Integer pageSize, String documentId);

    /**
     * 更新块
     *
     * @param datasetId 数据集ID
     * @param chunkId 块ID
     * @param request 更新块请求
     * @return 响应结果
     */
    ResponseDTO<Map<String, Object>> updateChunk(String datasetId, String chunkId, ChunkRequestDTO request);

    /**
     * 删除块
     *
     * @param datasetId 数据集ID
     * @param ids 块ID列表
     * @return 响应结果
     */
    ResponseDTO<Void> deleteChunks(String datasetId, List<String> ids);

    /**
     * 检索块
     *
     * @param datasetId 数据集ID
     * @param request 检索请求
     * @return 检索结果
     */
    ResponseDTO<ChunkResponseDTO.ChunkData> searchChunks(String datasetId, ChunkRequestDTO request);

    /**
     * 创建聊天助手
     *
     * @param request 创建聊天助手请求
     * @return 聊天助手响应
     */
    ResponseDTO<Map<String, Object>> createAssistant(AssistantRequestDTO request);

    /**
     * 获取聊天助手
     *
     * @param assistantId 聊天助手ID
     * @return 聊天助手响应
     */
    ResponseDTO<Map<String, Object>> getAssistant(String assistantId);

    /**
     * 更新聊天助手
     *
     * @param assistantId 聊天助手ID
     * @param request 更新聊天助手请求
     * @return 聊天助手响应
     */
    ResponseDTO<Map<String, Object>> updateAssistant(String assistantId, AssistantRequestDTO request);

    /**
     * 删除聊天助手
     *
     * @param assistantId 聊天助手ID
     * @return 响应结果
     */
    ResponseDTO<Void> deleteAssistant(String assistantId);

    /**
     * 获取聊天助手列表
     *
     * @param page 页码，默认为1
     * @param pageSize 每页大小，默认为30
     * @param orderBy 排序字段，可选create_time(默认)、update_time
     * @param desc 是否降序，默认为true
     * @param name 要检索的聊天助手名称
     * @param id 要检索的聊天助手ID
     * @return 聊天助手列表响应
     */
    ResponseDTO<Map<String, Object>> listChats(Integer page, Integer pageSize, String orderBy, Boolean desc, String name, String id);

    /**
     * 创建聊天会话
     *
     * @param chatId 聊天助手ID
     * @param request 创建会话请求
     * @return 会话响应
     */
    ResponseDTO<Map<String, Object>> createSession(String chatId, SessionRequestDTO request);

    /**
     * 更新聊天会话
     *
     * @param chatId 聊天助手ID
     * @param sessionId 会话ID
     * @param request 更新会话请求
     * @return 响应结果
     */
    ResponseDTO<Void> updateSession(String chatId, String sessionId, SessionRequestDTO request);

    /**
     * 获取聊天会话列表
     *
     * @param chatId 聊天助手ID
     * @param page 页码，默认为1
     * @param pageSize 每页大小，默认为30
     * @param orderBy 排序字段，可选create_time(默认)、update_time
     * @param desc 是否降序，默认为true
     * @param name 要检索的会话名称
     * @param id 要检索的会话ID
     * @param userId 要检索的用户ID
     * @return 会话列表响应
     */
    ResponseDTO<List<Map<String, Object>>> listSessions(String chatId, Integer page, Integer pageSize, String orderBy, Boolean desc, String name, String id, String userId);

    /**
     * 删除聊天会话
     *
     * 删除指定聊天助手的会话。可以通过提供会话ID列表进行批量删除，
     * 如果未提供会话ID列表，则会删除该聊天助手的所有会话。
     *
     * @param chatId 聊天助手ID
     * @param ids 会话ID列表，如果为null或空列表，则删除聊天助手的所有会话
     * @return 响应结果
     */
    ResponseDTO<Void> deleteSessions(String chatId, List<String> ids);

    /**
     * 与聊天助手对话
     *
     * 发送问题到聊天助手并获取回答。此接口可以创建新会话或在现有会话中继续对话。
     * 如果不提供session_id，系统将创建新会话并返回新的session_id。
     * 如果提供了session_id，则在该会话中继续对话。
     * 可选启用流式输出模式，实时获取响应。
     *
     * @param chatId 聊天助手ID
     * @param request 聊天完成请求，包含问题、是否流式输出等参数
     * @return 聊天助手的回答，包含答案内容、引用的知识块等信息
     */
    ResponseDTO<Map<String, Object>> chatCompletion(String chatId, CompletionRequestDTO request);

    /**
     * 与聊天助手流式对话
     *
     * 发送问题到聊天助手并以流式方式获取回答。此接口可以创建新会话或在现有会话中继续对话。
     * 如果不提供session_id，系统将创建新会话并返回新的session_id。
     * 如果提供了session_id，则在该会话中继续对话。
     * 该方法专门用于流式输出，响应会以Server-Sent Events (SSE)方式实时输出到客户端。
     *
     * @param chatId 聊天助手ID
     * @param request 聊天完成请求，包含问题、会话ID等参数
     * @param response HTTP响应对象，用于写入流式输出
     */
    void streamChatCompletion(String chatId, CompletionRequestDTO request, HttpServletResponse response);

    /**
     * 与代理对话
     *
     * 发送问题到代理并获取回答。此接口可以创建新会话或在现有会话中继续对话。
     * 如果不提供session_id，系统将创建新会话并返回新的session_id。
     * 如果提供了session_id，则在该会话中继续对话。
     * 可选启用流式输出模式，实时获取响应。
     *
     * @param agentId 代理ID
     * @param request 对话请求，包含问题、是否流式输出、会话ID等参数
     * @return 代理的回答，包含答案内容、引用的知识块等信息
     */
    ResponseDTO<Map<String, Object>> agentCompletion(String agentId, CompletionRequestDTO request);

    /**
     * 与代理流式对话
     *
     * 发送问题到代理并以流式方式获取回答。此接口可以创建新会话或在现有会话中继续对话。
     * 如果不提供session_id，系统将创建新会话并返回新的session_id。
     * 如果提供了session_id，则在该会话中继续对话。
     * 该方法专门用于流式输出，响应会以Server-Sent Events (SSE)方式实时输出到客户端。
     *
     * @param agentId 代理ID
     * @param request 对话请求，包含问题、会话ID等参数
     * @param response HTTP响应对象，用于写入流式输出
     */
    void streamAgentCompletion(String agentId, CompletionRequestDTO request, HttpServletResponse response);

    /**
     * 创建代理
     *
     * @param request 创建代理请求
     * @return 代理响应
     */
    ResponseDTO<Map<String, Object>> createAgent(AgentRequestDTO request);

    /**
     * 获取代理
     *
     * @param agentId 代理ID
     * @return 代理响应
     */
    ResponseDTO<Map<String, Object>> getAgent(String agentId);

    /**
     * 更新代理
     *
     * @param agentId 代理ID
     * @param request 更新代理请求
     * @return 代理响应
     */
    ResponseDTO<Map<String, Object>> updateAgent(String agentId, AgentRequestDTO request);

    /**
     * 删除代理
     *
     * @param agentId 代理ID
     * @return 响应结果
     */
    ResponseDTO<Void> deleteAgent(String agentId);

    /**
     * 获取代理列表
     *
     * @param page 页码
     * @param pageSize 每页大小
     * @param orderBy 排序字段
     * @param desc 是否降序
     * @param keywords 关键词
     * @return 代理列表响应
     */
    ResponseDTO<AgentResponseDTO.AgentData> listAgents(Integer page, Integer pageSize, String orderBy, Boolean desc, String keywords);


    /**
     * 创建代理会话
     *
     * @param agentId 代理ID
     * @param request 请求参数Map，包含Begin组件中指定的参数
     * @param userId 用户ID（可选）
     * @param file 上传的文件（可选）
     * @return 会话响应
     */
    ResponseDTO<Map<String, Object>> createAgentSession(String agentId, Map<String, Object> request, String userId, MultipartFile file);

    /**
     * 获取代理会话列表（带筛选条件）
     *
     * @param agentId 代理ID
     * @param page 页码
     * @param pageSize 每页大小
     * @param orderBy 排序字段
     * @param desc 是否降序
     * @param id 会话ID
     * @param userId 用户ID
     * @return 会话列表响应
     */
    ResponseDTO<ThreadResponseDTO.ThreadData> listAgentThreads(String agentId, Integer page, Integer pageSize, String orderBy, Boolean desc, String id, String userId);

    /**
     * 用户加入租户
     *
     * @param request 加入租户请求
     * @return 加入租户响应
     */
    ResponseDTO<TenantJoinResponseDTO> joinTenant(TenantJoinRequestDTO request);
}
